#include<iostream>
#include<stdio.h>
#include<unistd.h>
#include<vector>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

//函数指针类型
typedef void(*handler_t)();
//方法集
std::vector<handler_t> handlers;
void func1()
{
  printf("hello,我是方法1\n");
}
void func2()
{
  printf("hello,我是方法2\n");
}
void Load()
{
  handlers.push_back(func1);
  handlers.push_back(func2);
}

int main()
{
  pid_t id = fork();
  if(id==0)
  {
    //子进程
    while(1)
    {
      printf("我是子进程，我的pid：%d,我的ppid：%d\n",getpid(),getppid());
      sleep(5);
     // int *p=NULL;
     // *p=100; //野指针
     // break;
    }
    exit(100);
  }
  else if(id>0)
  {
    //父进程
    //基于非阻塞的轮巡检测方案
   int status=0;
   while(1)
   {
     pid_t ret=waitpid(-1,&status,WNOHANG);
     if(ret>0)
     {
       printf("等待成功，返回值为：%d,exit signal:%d,exit code:%d\n",ret,status&0x7F,(status>>8)&0xFF);
       break;
     }
     else if(ret==0)
     {
       //等待成功了，但是子进程没有退出
       printf("我是父进程，等待子进程，奥，还没，那么我父进程做其他事情...\n");
       if(handlers.empty()) Load();
       for(auto f : handlers)
       {
         f(); //回调处理对应的任务
       }
       sleep(1);
     }
   }

   // printf("我是父进程，我的pid：%d,我的ppid:%d\n",getpid(),getppid());
   // int status=0;
   // pid_t ret=waitpid(-1,&status,0);
   // if(ret>0)
   // {
   //   printf("等待成功!我等待的返回值：%d,exit signal:%d,exit code:%d\n",ret,status&0x7F,(status>>8)&0xFF);
   // }
   // sleep(3);
  }
}
